const ROOT_PATH = require('app-root-path');//项目根路径
const common = require(ROOT_PATH + '/common/common');
const coding = "";//"SET NAMES 'utf8';";// 编码方式
const config = require(ROOT_PATH + '/config');//配置文件
const $mysql = require('mysql');

let poolConn = function () {
  return $mysql.createPool(config.DB_CONFIG);
};

const pool = poolConn();//创建数据库连接池

//多条sql语句查询(需要数据库连接需要开启:"multipleStatements": true,)
let queryAlls = (sql, ...params) => {
  sql = $mysql.format(coding + sql, params);
  
  console.log(sql);
  return new Promise(function (resolve, reject) {
    pool.getConnection(function (err, conn) {
      if (err) {
        reject(err);
        return;
      }
      conn.query(sql, (err, result) => {
        conn.release();//连接不再使用，返回到连接池
        if (err) {
          reject(err);
          return;
        }
        coding ? result.shift() : coding;
        resolve(result);
      });
    });
  });
};

// 返回一个数组对象，所有数据
let queryAll = (sql, ...params) => {
  sql = $mysql.format(coding + sql, params);

  console.log(sql);
  return new Promise(function (resolve, reject) {
    pool.getConnection(function (err, conn) {
      if (err) {
        reject(err);
        return;
      }
      conn.query(sql, (err, result) => {
        conn.release();//连接不再使用，返回到连接池
        if (err) {
          reject(err);
          return;
        }
        coding ? result.shift() : coding;
        result = common.arrSingle(result);//多维数组转一维
        // coding ? result[0] :
        resolve(result);
      });
    });
  });
};

// 返回一个对象，一条数据
let queryOne = (sql, ...params) => {
  sql = $mysql.format(coding + sql, params);

  console.log(sql);
  return new Promise((resolve, reject) => {
    pool.getConnection(function (err, conn) {
      if (err) {
        reject(err);
        return;
      }
      conn.query(sql, (err, result) => {
        conn.release();//连接不再使用，返回到连接池
        if (err) {
          reject(err);
          return;
        }
        coding ? result.shift() : coding;
        resolve(coding ? result[0][0] : result[0] || {});
      });
    });
  });
};

// 返回单个查询结果，一个值
let querySingle = (sql, ...params) => {
  sql = $mysql.format(coding + sql, params);

  console.log(sql);
  return new Promise((resolve, reject) => {
    pool.getConnection(function (err, conn) {
      if (err) {
        reject(err);
        return;
      }
      conn.query(sql, (err, result) => {
        conn.release();//连接不再使用，返回到连接池
        if (err) {
          reject(err);
          return;
        }
        if(coding){
          result.shift();
          result = common.arrSingle(result);//[].concat.apply([],result);//多维数组转一维
        }
        for (let i in result[0]) {
          resolve(result[0][i] || "");
          return;
        }
        resolve("");
      });
    });
  });
};

module.exports = {
  poolConn,
  queryAll,
  queryOne,
  queryAlls,
  querySingle
};
